package 线程1;

//Thread 是java标准库中描述的一个关于线程的类
//常用的方式就是自己定义一个类继承Thread.
//重写Thread中的run方法.run方法就是表示线程要执行的具体任务(代码).

//有以下五种创建线程的方式:
// 1.通过继承Thread,重写run.2.实现Runnable接口,重写run.
// 3.继承Thread,重写run,使用匿名内部类的方式.4.实现Runnable,重写run,使用匿名内部类
//5.使用lambda表达式来表示要执行的任务
//以上创建线程的方式,本质都相同.都是借助Thread类,在内核中创建新的PCB,加入到内核的双向链表中...
//只不过区别是,指定线程要执行的任务不同(java语法层面的区别)

/**
 * 在jdk里内置了一个jconsole工具,就可以看到线程的信息(idea也可以看到)
 * 步骤:找到jdk,找到bin文件.
 */

class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("hello thread!");
    }
}
public class ThreadDemo1 {
    public static void main(String[] args) {
//        Thread t = new Thread();
        Thread t = new MyThread();
//        start方法,就会在操作系统中真的创建一个线程出来.(内核中搞个PCB,加入到双线链表中)
//        这个新的线程,就会执行run中所描述的代码.
        t.start();

        //为什么不用t.run()呢?有啥区别?
        /**
         * t.start(),并发式
         * 当点击"运行",
         * 系统首先会创建一个进程.这个进程里面已经包含了一个线程.这个线程执行的代码,就是main方法
         * --
         * 系统里中本来就有很多pcd
         *
         * 执行t.start()操作,也就创建了一个新的PCD,也挂在一个链表上.
         *
         * --
         * MyThrea.run
         * 这个代码就打印出了内容
         *
         *
         * =========
         *
         * t.run();
         * 这个操作没有创建新的线程
         * --
         * 点击程序,搞了一个新的PCB出来
         * main,直接调用t.run(),打印了内容
         */
    }
}
